/*
 * @Author: wangyingjie 2778809626@qq.com
 * @Date: 2025-04-16 14:12:00
 * @LastEditors: wangyingjie 2778809626@qq.com
 * @LastEditTime: 2025-04-17 10:34:20
 * @FilePath: /ros2_proj_template/src/publish_pkg/src/publishTool.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "publishTool.h"
#include "config/module_a_config.h"

publisher::publisher(std::string name) : Node(name)
{
  // 发布者的构造函数
  std::string pubName = name + "_pub";
  RCLCPP_INFO(this->get_logger(), pubName.c_str());

  // 3. 创造一个发布者
  // 使用create_publisher这个函数创建发布者对象，并声明一下他的发布的数据类型
  // 两个参数，
  // 第一个是发布的话题名称，
  // 第二个是队列长度,当发布者发布消息的速度快于订阅者接收消息的速度时，消息会被暂时存储在发布队列中。这里的 10 表示发布队列的长度为 10，即最多可以存储 10 条待发布的消息。如果队列已满而发布者尝试发布新的消息，那么最早进入队列的消息将被丢弃
  pub_er = this->create_publisher<std_msgs::msg::String>(pubName.c_str(), 10);
}

// 析构函数，该函数在释放对象后调用，或者按CTRL+C后调用
publisher::~publisher()
{
  RCLCPP_INFO(this->get_logger(), "delete publisher");
}

// 调用该函数，使用发布者把数据发布出去
void publisher::publish_data()
{
  // 声明一个存储数据的对象
  std_msgs::msg::String text_data;

  // --------------------自定义发布数据 beg--------------------
  std::stringstream ss;
  ss << "\n 发布内容: \n "
     << module_a_config::sample().name << " "
     << module_a_config::sample().age << " "
     << module_a_config::sample().height << " ";
  for (const auto &item : module_a_config::sample().hobbies)
  {
    ss << item << " ";
  }
  for (const auto &[key, value] : module_a_config::sample().address)
  {
    ss << key << " : " << value << " ";
  }
  ss << "\n";
  // --------------------自定义发布数据 end--------------------


  // 向对象中存储数据要调用该数据类型对象的data
  text_data.data = ss.str();
  pub_er->publish(text_data);
  RCLCPP_INFO(this->get_logger(), text_data.data.c_str());
}